// 1-4-2 重载运算符和重载函数-实例-成员运算符->重载实现智能指针
#include <iostream>
#include <vector>

class Obj
{
private:
  static int a;
  static int b;
  int c = 20;

public:
  // void printA()
  void printA() const
  {
    std::cout << "a : " << a++ << std::endl;
  }
  // void printB()
  void printB() const
  {
    std::cout << "b : " << ++b << std::endl;
    // std::cout << "c : " << c << std::endl;
    // std::cout << "c : " << this->c << std::endl;
  }

  // 写试试，没用
  // Obj *operator->()
  // {
  //   std::cout << "Obj.operator->()" << std::endl;
  //   return this;
  // }
};
// 静态成员变量初始化
int Obj::a = 0;
int Obj::b = -1;

// 给obj*建立容器
class ObjContainer
{
private:
  std::vector<Obj *> a;
  friend class SmartPointer;

public:
  void add(Obj *ptr)
  {
    a.push_back(ptr);
  }
};

// 智能指针方便访问obj成员
class SmartPointer
{
private:
  // int index;
  // long long unsigned int index;
  size_t index;
  ObjContainer oc;

public:
  SmartPointer(ObjContainer &xx)
  {
    index = 0;
    oc = xx;
  }
  // 前置
  bool operator++()
  {
    if (oc.a.size() == 0)
    {
      std::cout << "container is empty" << std::endl;
      return false;
    }
    if (index > oc.a.size() - 1)
    {
      std::cout << "out of range" << std::endl;
      return false;
    }
    if (oc.a[++index] == 0)
    {
      std::cout << "item is not exist" << std::endl;
      return false;
    }
    return true;
  }

  // 后置
  bool operator++(int)
  {
    return operator++();
  }

  // Obj *operator->()
  Obj *operator->() const
  {
    // std::cout << " do operator -> ()" << std::endl;
    if (oc.a.size() == 0)
    {
      std::cout << "container is empty" << std::endl;
      return (Obj *)0;
    }
    if (!oc.a[index])
    {
      std::cout << "zero value" << std::endl;
      return (Obj *)0;
    }
    return oc.a[index];
  }

  operator bool()
  {
    // std::cout << "(bool)SmartPointer" << std::endl;
    bool b = oc.a.size() != 0;
    // std::cout << "bool value : " << b << std::endl;
    return b;
  }
};

int main(void)
{
  ObjContainer oc;

  const int size = 10;
  for (int i = 0; i < size; i++)
  {
    Obj obj;
    oc.add(&obj);
  }

  SmartPointer sp(oc);
  do
  {
    // 语句 sp->printA() 被解释为 (sp.operator->())->printA()。
    // (obj*)0 -> printA() 会报错
    // if(bool(sp)){
    //   sp->printA();
    //   sp->printB();
    // }

    // if有隐式类型转换
    if (sp)
    {
      // std::cout << "???" << std::endl;
      sp->printA();
      sp->printB();
    }
  } while (sp++);

  printf("-----------------end-----------------\n");
  return 0;
}